home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok24.lha / DME / SRC / source.zoo / m2err.c < prev    next >
C/C++ Source or Header  |  1989-07-03  |  6KB  |  325 lines

  1. #include "defs.h"
  2.  
  3. #define  MSGFILE    "M2:Fehler-Meldungen"
  4.  
  5. extern IBASE *IntuitionBase;
  6. extern PROC *proc;
  7.  
  8. ubyte *msgfile = NULL;
  9.  
  10. void
  11. err_insline()
  12. {
  13.   register m2_error *err;
  14.   register int      line = Ep->Line;
  15.   register int      i;
  16.  
  17.   /* search first error */
  18.   err = Ep->err_list;
  19.   i = 1;
  20.   while((err->line < line) && ( i <= Ep->err_num)) {
  21.     i++;
  22.     err++;
  23.   }
  24.   /* increment following error-lines */
  25.   while( i <= Ep->err_num ) {
  26.     if(err->line != -1)
  27.       err->line++;
  28.     err++;
  29.     i++;
  30.   }
  31. }
  32.  
  33. void
  34. err_deline(line)
  35. int line;
  36. {
  37.   register m2_error *err;
  38.   register int      i;
  39.  
  40.   /* search first error */
  41.   err = Ep->err_list;
  42.   i = 1;
  43.   while((err->line < line) && ( i <= Ep->err_num)) {
  44.     i++;
  45.     err++;
  46.   }
  47.   if(err->line == line) {
  48.     err->line = -1;
  49.     i++;
  50.     err++;
  51.   }
  52.   /* decrement following error-lines */
  53.   while( i <= Ep->err_num ) {
  54.     if(err->line != -1)
  55.       err->line--;
  56.     err++;
  57.     i++;
  58.   }
  59. }
  60.  
  61. void
  62. calc_xy(col,row,pos)
  63. long *col;
  64. long *row;
  65. long pos;
  66. {
  67.   register long   len;
  68.   register long   count;
  69.   register ubyte **line;
  70.  
  71.   count = 0;
  72.   *col  = 0;
  73.   *row  = 0;
  74.   line = Ep->List;
  75.  
  76.   do {
  77.     len = strlen(*(line++))+1;
  78.     count += len;
  79.     (*row)++;
  80.   } while(count < pos);
  81.  
  82.   (*row)--;
  83.   *col = pos - (count - len);
  84. }
  85.  
  86. get_errmsg(str,num)
  87. ubyte *str;
  88. uword num;
  89. {
  90.   register ubyte   *err, *nexterr;
  91.   register short   found = 0;
  92.  
  93.   err = (ubyte *) msgfile;
  94.   while( ((nexterr = *(ulong *) err+msgfile) != (ubyte *)NULL )
  95.          && (!found)) {
  96.     if( *(uword *)(err+4) == num) {
  97.       strcpy(str,err+6);
  98.       strcat(str," ");
  99.       found = -1;
  100.     }
  101.     err = nexterr;
  102.   }
  103.   if(!found)
  104.     strcpy(str,"Unknown error ");
  105. }
  106.  
  107. ubyte *read_buffer(name,len,errstr)
  108. ubyte *name;
  109. ulong *len;
  110. ubyte *errstr;
  111. {
  112.   register struct FileLock      *lock,*Lock();
  113.   register struct FileHandle    *handle,*Open();
  114.   register struct FileInfoBlock *fib;
  115.   register ubyte                *buf = 0;
  116.   register ubyte                str[80];
  117.  
  118.   proc->pr_WindowPtr = (APTR)Ep->Win;
  119.   if( lock = Lock(name,SHARED_LOCK)) {
  120.     fib = malloc(sizeof(struct FileInfoBlock));
  121.     Examine(lock,fib);
  122.     if(buf = (ubyte *) malloc(fib->fib_Size)) {
  123.       handle = Open(name, MODE_OLDFILE);
  124.       *len = Read(handle,buf,fib->fib_Size);
  125.       if(*len != fib->fib_Size) {
  126.         strcpy(str,"error reading ");
  127.         strcat(str, name);
  128.         title(str);
  129.         Abortcommand = 1;
  130.         free(buf);
  131.         buf = 0;
  132.       }
  133.       Close(handle);
  134.     } else {
  135.       title("Out of memory error");
  136.       Abortcommand = 1;
  137.     }
  138.     free(fib);
  139.     UnLock(lock);
  140.   } else {
  141.     title(errstr);
  142.     Abortcommand = 1;
  143.   }
  144.   return(buf);
  145. }
  146.  
  147. uword
  148. read_errfile()
  149. {
  150.   register long      count;
  151.   register ubyte    *ptr,*pos;
  152.   register m2_error *m2err,*m2err2;
  153.            long      len;
  154.            ubyte str[100];
  155.  
  156.   len = strlen(Ep->Name);
  157.  
  158.   /* is suffix = ".def" or ".mod" ? */
  159.   if(len <= 4)
  160.     return (uword)0;
  161.   if(ncstrcmp(&Ep->Name[len-4],".DEF") && ncstrcmp(&Ep->Name[len-4],".MOD"))
  162.     return (uword)0;
  163.  
  164.   /* read error-file */
  165.   strcpy(str,Ep->Name);
  166.   strcat(str,"e");
  167.   if(!(ptr = read_buffer(str,&len,"No errors")))
  168.     return (uword)0;
  169.   if( *(ulong *)ptr != M2_ERRFILE ) {
  170.     strcat(str, " is no error-file");
  171.     title(str);
  172.     free(ptr);
  173.     return (uword)0;
  174.   }
  175.  
  176.   /* read message-file */
  177.   strcpy(str,MSGFILE);
  178.   strcat(str," not found");
  179.   if(!msgfile)
  180.     if(!(msgfile = read_buffer(MSGFILE,&len,str)))
  181.       return (uword)0;
  182.  
  183.   pos = ptr + 4;
  184.   count = 0;
  185.   while(pos < (ptr+len)) {
  186.     if(*(ulong *)pos == M2_ERR)
  187.       count ++;
  188.     pos+=2;
  189.   }
  190.  
  191.   sprintf(str,"%ld errors",count);
  192.   title(str);
  193.  
  194.   if(!( m2err = (m2_error *) malloc(count*sizeof(m2_error)))) {
  195.     title("Not enough memory for error-list");
  196.     return (uword)0;
  197.   }
  198.  
  199.   Ep->err_list = m2err;
  200.   Ep->err_num = 0;
  201.   Ep->last_err = -1;
  202.  
  203.   pos = ptr + 4;
  204.   while(pos < (ptr+len)) {
  205.     if(*(uword *)pos == M2_EOF)
  206.       break;
  207.     if(*(ulong *)pos != M2_ERR) {
  208.       title("Format-error in errorfile");
  209.       return (uword)0;
  210.     }
  211.     pos += 4;
  212.     calc_xy(&m2err->column,&m2err->line,*(ulong *)pos);
  213.     pos += 4;
  214.     sprintf(m2err->msg,"%ld : ",(long)*(uword *)pos);
  215.     do {
  216.       if(*pos == M2_STR) {
  217.         pos++;
  218.         strcat(&m2err->msg[strlen(m2err->msg)],pos);
  219.         while(*pos)
  220.           pos++;
  221.         pos++;
  222.         if(!(*pos))
  223.           pos++;
  224.       } else {
  225.         get_errmsg(&(m2err->msg[strlen(m2err->msg)]),*(uword *)pos);
  226.         pos += 2;
  227.       }
  228.     } while( (*(ulong *)pos != M2_ERR) && (*(uword *)pos != M2_EOF) );
  229.     m2err ++;
  230.     Ep->err_num++;
  231.   }
  232.   free(ptr);
  233.  
  234.   return (uword)count;
  235. }
  236.  
  237. void err_quit()
  238. {
  239.   free(Ep->err_list);
  240.   Ep->err_list = 0;
  241.   Ep->err_num = 0;
  242. }
  243.  
  244. do_firsterr()
  245. {
  246.   if(Ep->err_num) {
  247.     Ep->last_err = -1;
  248.     do_nexterr();
  249.   } else {
  250.     title("No errors");
  251.     Abortcommand = 1;
  252.   }
  253. }
  254.  
  255. do_nexterr()
  256. {
  257.   if(Ep->err_num) {
  258.     if(Ep->last_err < Ep->err_num)
  259.       Ep->last_err++;
  260.     do_currenterr();
  261.   } else {
  262.     title("No errors");
  263.     Abortcommand = 1;
  264.   }
  265. }
  266.  
  267. do_preverr()
  268. {
  269.   if(Ep->err_num) {
  270.     if(Ep->last_err > 0) {
  271.       Ep->last_err--;
  272.       do_currenterr();
  273.     } else {
  274.       title("Already first error");
  275.     }
  276.   } else {
  277.     title("No errors");
  278.     Abortcommand = 1;
  279.   }
  280. }
  281.  
  282. do_currenterr()
  283. {
  284.   m2_error *err;
  285.  
  286.   if (IntuitionBase->ActiveWindow != Ep->Win) {
  287.       WindowToFront(Ep->Win);
  288.       ActivateWindow(Ep->Win);
  289.   }
  290.  
  291.   if(Ep->err_num == 0) {
  292.     title("No errors");
  293.     Abortcommand = 1;
  294.   } else {
  295.     if(Ep->last_err == -1)
  296.       Ep->last_err = 0;
  297.  
  298.     if(Ep->err_num == -1) {
  299.       title("Errorfile confused because of block-operations");
  300.       Abortcommand = 1;
  301.       return;
  302.     }
  303.  
  304.     if(Ep->last_err >= Ep->err_num) {
  305.       title("No more errors");
  306.       Abortcommand = 1;
  307.     } else {
  308.       text_sync();
  309.       err = Ep->err_list + Ep->last_err;
  310.       if(err->line == -1) {
  311.         do_nexterr();
  312.       } else {
  313.         Ep->Column = err->column;
  314.         if(err->line <= Ep->Lines) {
  315.           Ep->Line = err->line;
  316.           text_load();
  317.           text_sync();
  318.           title(err->msg);
  319.         }
  320.       }
  321.     }
  322.   }
  323. }
  324.  
  325.